/**
 * 根据传入数值大小转换为空间字符串
 * @param {Object} bytes
 */
function formatBytes(bytes) {
	const sizes = ['B', 'KB', 'MB', 'GB', 'TB']
	if (bytes == 0) {
		return 'n/a'
	}
	const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)))
	if (i == 0) {
		return bytes + ' ' + sizes[i]
	}
	return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + sizes[i]
}

export default {
	formatBytes,
	isString: (str) => typeof str === 'string' || str instanceof String,
	isNumberStr: (str) => /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str),
	debounce: (func, wait, immediate) => {
	  let timeout, args, context, timestamp, result
	
	  const later = function() {
	    // 据上一次触发时间间隔
	    const last = +new Date() - timestamp
	
	    // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
	    if (last < wait && last > 0) {
	      timeout = setTimeout(later, wait - last)
	    } else {
	      timeout = null
	      // 如果设定为immediate===true，因为开始边界已经调用过了此处无需调用
	      if (!immediate) {
	        result = func.apply(context, args)
	        if (!timeout) context = args = null
	      }
	    }
	  }
	
	  return function(...args) {
	    context = this
	    timestamp = +new Date()
	    const callNow = immediate && !timeout
	    // 如果延时不存在，重新设定延时
	    if (!timeout) timeout = setTimeout(later, wait)
	    if (callNow) {
	      result = func.apply(context, args)
	      context = args = null
	    }
	
	    return result
	  }
	}
}